package cm.dpassyann.speedDating.ui.activity.update.activity;

import java.io.File;

import roboguice.activity.RoboActivity;
import roboguice.inject.ContextSingleton;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.view.Window;
import cm.dpassyann.speedDating.R;
import cm.dpassyann.speedDating.ui.activity.start.activity.StartActivity;
import cm.dpassyann.speedDating.ui.activity.update.IUpdateApplicationActivity;
import cm.dpassyann.speedDating.ui.activity.update.task.UpdateApplicationTask;
import cm.dpassyann.speedDating.util.SpeedatingUtil;

import com.google.inject.Inject;

/**
 * Activité de mise à jour de l'application.
 * 
 * @author dpassyann
 */
@ContextSingleton
public class UpdateApplicationActivity extends RoboActivity implements IUpdateApplicationActivity {

	/**
	 * On utilise un Provider pour les ASyncTask, car elles ne peuvent être
	 * utilisées qu'une seule fois. Ce n'est pas absolument nécessaire ici, mais
	 * c'est une bonne pratique à adopter.
	 * 
	 * Guice va automatiquement créer le Provider nécessaire et l'injecter.
	 * 
	 * le commentaire au dessus est obeslète avec la nouvelle version de RoboGuice(2.0)
	 * on définit ce contexte directement en singleton et plus besoin du provider
	 */
	@Inject UpdateApplicationTask	updateApplicationTask;
	
	@Inject SpeedatingUtil status;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

		setContentView(R.layout.update_ui);

		setProgressBarIndeterminateVisibility(true);

		/**
		 * On récupère le code de version situé dans le fichier
		 * AndroidManifest.xml (tag manifest, attribut android:versionCode)
		 */
		PackageInfo packageInfo;
		
		if(status.isOnline(this)){
			try {
				packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
			} catch (NameNotFoundException e) {
				throw new IllegalStateException("Should not happen", e);
			}
			updateApplicationTask.execute(packageInfo.versionCode);
		}
		else{
			onApplicationUpToDate();
		}
	}

	public void onApplicationUpToDate() {
		//application à jour
		//Toast.makeText(this, R.string.updating_up_to_date, Toast.LENGTH_SHORT).show();
		finish();
		startActivity(new Intent(this, StartActivity.class));
	}

	public void onUpdateFailed(Exception e) {

		String message = String.format(getString(R.string.updating_failed_message), e.getMessage());

		/*
		 * Notez l'utilisation de commentaires vides (//) pour rendre lisible
		 * les chaining methods. En l'absence de //, Eclipse reformate le code
		 * de manière peu lisible.
		 */
		new AlertDialog.Builder(this)//
				.setTitle(R.string.updating_failed_title) //
				.setCancelable(false) //
				.setMessage(message) //
				.setPositiveButton(R.string.updating_failed_continue, new OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						finish();
						startActivity(new Intent(UpdateApplicationActivity.this, StartActivity.class));
					}
				}) //
				.setNegativeButton(R.string.updating_failed_exit, new OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						finish();
					}
				})//
				.create()//
				.show();
	}

	public void onUpdateDownloaded(File file) {
		Intent i = new Intent();
		i.setAction(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
		startActivity(i);
	}

}
